/**
 * @file    pylon_rs485_v35.h
 * @brief   派能EMS协议-低压协议
 * @author  liuwei
 * @version 1.0.1
 * @date    2024/10/28
 * 
 * @copyright Copyright (c) 2023 JBD-Energy Storage Technology Co. LTD
 * 
 * @par 修改日志:
 * <table>
 * <tr><th>Date       <th>Version   <th>Author   <th>Description
 * <tr><td>2023-07-10 <td>1.0.1     <td>Liuwei   <td>首次创建
 * </table>
 */

/* includes ------------------------------------------------------------------*/
#include "deye_1363_rs485.h"
#include "yd1363_app.h"
#include "yd1363_data.h"
#include "cfg_prj.h"
#include "var_mng.h"
#include "param_mng.h"
#include "parallel.h"
#include "mcu_type.h"
#include "boot_param.h"
#include "If_di.h"
#include "sample.h"
/* macro/define --------------------------------------------------------------*/
typedef struct 
{
	uint8_t cmd;
	uint8_t(*p_call_func)(ydt1363_data_type , uint8_t* , uint16_t*);
}yd1363_cmd_type;

#define YD1363_BMS_ADDR          (0x02)
#define PTL_VERSION              (0x20)
/* local functions -----------------------------------------------------------*/
static uint8_t deal_42h_cmd(ydt1363_data_type recv_data, uint8_t* tx_buf, uint16_t* tx_len);
static uint8_t deal_44h_cmd(ydt1363_data_type recv_data, uint8_t* tx_buf, uint16_t* tx_len);
static uint8_t deal_47h_cmd(ydt1363_data_type recv_data, uint8_t* tx_buf, uint16_t* tx_len);
static uint8_t deal_4Fh_cmd(ydt1363_data_type recv_data, uint8_t* tx_buf, uint16_t* tx_len);
static uint8_t deal_51h_cmd(ydt1363_data_type recv_data, uint8_t* tx_buf, uint16_t* tx_len);
static uint8_t deal_60h_cmd(ydt1363_data_type recv_data, uint8_t* tx_buf, uint16_t* tx_len);
static uint8_t deal_61h_cmd(ydt1363_data_type recv_data, uint8_t* tx_buf, uint16_t* tx_len);
static uint8_t deal_62h_cmd(ydt1363_data_type recv_data, uint8_t* tx_buf, uint16_t* tx_len);
static uint8_t deal_63h_cmd(ydt1363_data_type recv_data, uint8_t* tx_buf, uint16_t* tx_len);
static uint8_t deal_92h_cmd(ydt1363_data_type recv_data, uint8_t* tx_buf, uint16_t* tx_len);
static uint8_t deal_93h_cmd(ydt1363_data_type recv_data, uint8_t* tx_buf, uint16_t* tx_len);
static uint8_t deal_94h_cmd(ydt1363_data_type recv_data, uint8_t* tx_buf, uint16_t* tx_len);
static uint8_t deal_95h_cmd(ydt1363_data_type recv_data, uint8_t* tx_buf, uint16_t* tx_len);
static uint8_t deal_96h_cmd(ydt1363_data_type recv_data, uint8_t* tx_buf, uint16_t* tx_len);

/* static variables ----------------------------------------------------------*/
static ydt1363_data_type recv_data = {0};
static yd1363_cmd_type pylon_cmd_func[] = 
{
    {0x42 , deal_42h_cmd },
    {0x44 , deal_44h_cmd },
    {0x47 , deal_47h_cmd },
    {0x4F , deal_4Fh_cmd },
    {0x51 , deal_51h_cmd },
    {0x60 , deal_60h_cmd },
    {0x61 , deal_61h_cmd },
    {0x62 , deal_62h_cmd },
    {0x63 , deal_63h_cmd },
    {0x92 , deal_92h_cmd },
    {0x93 , deal_93h_cmd },
    {0x94 , deal_94h_cmd },
    {0x95 , deal_95h_cmd },
    {0x96 , deal_96h_cmd },
};

#define PYLON_CMD_NUM         (sizeof(pylon_cmd_func)/sizeof(yd1363_cmd_type))
    
extern master_data_type master_data_reg;
static uint8_t pylon_rs485_v35_flag = 0;
static uint8_t pylon_rs485_v28_flag = 0;
/* global variables ----------------------------------------------------------*/

/** ------------------------------------------------------------------------- *
  *                             Global function
 ** ------------------------------------------------------------------------- */
uint8_t deye_1363_rs485_v35_analysis(uint8_t *rx_buf , uint16_t rx_len ,uint8_t *tx_buf , uint16_t *tx_len)
{
    uint8_t i = 0;
    uint8_t flag = FALSE;
	if(TRUE == ydt1363_com_analysis(rx_buf , rx_len ,&recv_data))
	{
        if((0x12 == recv_data.addr) && (pylon_rs485_v35_flag == 0)) 
        {
			pylon_rs485_v28_flag = 1;
            for( i = 0;i < PYLON_CMD_NUM; ++ i)
            {
                if(pylon_cmd_func[i].cmd == recv_data.cid2)
                {
                    if(TRUE == pylon_cmd_func[i].p_call_func(recv_data , tx_buf , tx_len))
                       flag = TRUE; 
                    
                    break;
                }
            }
            return flag;
        }

       else if((0x02 == recv_data.addr) && (pylon_rs485_v28_flag == 0)) 
        {
			pylon_rs485_v35_flag = 1;
            for( i = 0;i < PYLON_CMD_NUM; ++ i)
            {
                if(pylon_cmd_func[i].cmd == recv_data.cid2)
                {
                    if(TRUE == pylon_cmd_func[i].p_call_func(recv_data , tx_buf , tx_len))
                       flag = TRUE; 
                    
                    break;
                }
            }
            return flag;
        }
        else
        {
            return FALSE;
        }
	}
	else 
		return FALSE;
}

/** ------------------------------------------------------------------------- *
  *                              Local function
 ** ------------------------------------------------------------------------- */
static uint8_t deal_42h_cmd(ydt1363_data_type recv_data, uint8_t* tx_buf, uint16_t* tx_len)
{
    uint16_t tx_idx = 0;
    uint16_t i = 0;
    uint16_t temp_val = 0;
	int32_t bur_curr = 0;
	uint16_t data_len = 0;
    uint8_t addr = 0;
    uint32_t u32_temp = 0;
	uint8_t cell_num = 0;

    tx_buf[tx_idx ++ ] = SOI;
    byte_to_ascii(recv_data.ver , &tx_buf[tx_idx]);
    tx_idx += 2;
    byte_to_ascii(recv_data.addr , &tx_buf[tx_idx]);
    tx_idx += 2;
    byte_to_ascii(recv_data.cid1 , &tx_buf[tx_idx]);
    tx_idx += 2;
    byte_to_ascii(0x00 , &tx_buf[tx_idx]);
    tx_idx += 2;
    /* 长度 */
    half_to_ascii(0x00 , &tx_buf[tx_idx]);
    tx_idx += 4;
	/* INFO */
	half_to_ascii(recv_data.addr, &tx_buf[tx_idx]);
    tx_idx += 4;
    /* 数据内容 */ 
//	if(recv_data.addr >= 0x10)
//		addr = recv_data.addr - 0x12;
//    else if(recv_data.addr >= 2)
//        addr = recv_data.addr - 2;
//    else
//        return FALSE;
//    
//	if((master_data_reg.com_err_state & (1 << addr)) == 0)
//		return FALSE;
//	if(0x12 != recv_data.addr)
//		return FALSE;
	
	addr = 0;

	cell_num = param_get_data(PAR_ID_CB_CELL_NUM);
	if(cell_num >= CELL_MAX_NUM)
		cell_num = CELL_MAX_NUM;
    byte_to_ascii( cell_num , &tx_buf[tx_idx]);
    tx_idx += 2;
    for(i = 0;i < cell_num; ++ i)
    {
        half_to_ascii(master_data_reg.slave_data[addr].cell_volt_buf[i], &tx_buf[tx_idx]);
        tx_idx += 4;
    }
    temp_val = SLAVE_TEMP_NUM + 2;
	byte_to_ascii(temp_val, &tx_buf[tx_idx]);
    tx_idx += 2;
	for(i = 0;i < SLAVE_TEMP_NUM; ++ i)
	{
		half_to_ascii(master_data_reg.slave_data[addr].cell_temp_buf[i] , &tx_buf[tx_idx]);
		tx_idx += 4;
	}
    half_to_ascii(master_data_reg.slave_data[addr].env_temp , &tx_buf[tx_idx]);
    tx_idx += 4;	
	half_to_ascii(master_data_reg.slave_data[addr].mos_temp , &tx_buf[tx_idx]);
    tx_idx += 4;	

	bur_curr = master_data_reg.total_bus_curr;
	half_to_ascii(bur_curr * 0.1 , &tx_buf[tx_idx]);
    tx_idx += 4;
	temp_val = master_data_reg.avg_batt_volt * 10;
	half_to_ascii(temp_val , &tx_buf[tx_idx]);
    tx_idx += 4;
	u32_temp = master_data_reg.total_real_cap;
	byte_to_ascii(u32_temp >> 8, &tx_buf[tx_idx]);
	tx_idx += 2;
	byte_to_ascii(u32_temp & 0xff , &tx_buf[tx_idx]);
    tx_idx += 2;
	byte_to_ascii(3 , &tx_buf[tx_idx]);
    tx_idx += 2;
	u32_temp = master_data_reg.total_full_cap;
    byte_to_ascii(u32_temp >> 8, &tx_buf[tx_idx]);
	tx_idx += 2;
    byte_to_ascii(u32_temp & 0xff, &tx_buf[tx_idx]); 
	tx_idx += 2;
	half_to_ascii(master_data_reg.slave_data[addr].cycle , &tx_buf[tx_idx]);
    tx_idx += 4;
	u32_temp = master_data_reg.total_full_cap;
	byte_to_ascii(u32_temp >> 8, &tx_buf[tx_idx]);
	tx_idx += 2;
	byte_to_ascii(u32_temp & 0xff, &tx_buf[tx_idx]);
	tx_idx += 2;	
    
    data_len = yd1363_calc_len(tx_idx - 13);
	half_to_ascii(data_len , &tx_buf[9]);
	temp_val = yd1636_calc_crc(&tx_buf[1] , tx_idx - 1);
	half_to_ascii(temp_val , &tx_buf[tx_idx]);
    tx_idx += 4;
	tx_buf[tx_idx ++ ] = EOI;
    
    *tx_len = tx_idx;
    return TRUE;
}

static uint8_t deal_44h_cmd(ydt1363_data_type recv_data, uint8_t* tx_buf, uint16_t* tx_len)
{
    uint16_t tx_idx = 0;
    uint16_t i = 0;
    uint16_t temp_val = 0;
	uint16_t data_len = 0;
    uint8_t status = 0;
	uint8_t cell_num = 0;
	uint8_t addr = 0;
	uint8_t temp_num = 0;
    tx_buf[tx_idx ++ ] = SOI;
    byte_to_ascii(recv_data.ver , &tx_buf[tx_idx]);
    tx_idx += 2;
    byte_to_ascii(recv_data.addr , &tx_buf[tx_idx]);
    tx_idx += 2;
    byte_to_ascii(recv_data.cid1 , &tx_buf[tx_idx]);
    tx_idx += 2;
    byte_to_ascii(0x00 , &tx_buf[tx_idx]);
    tx_idx += 2;
    /* 长度 */
    half_to_ascii(0x00 , &tx_buf[tx_idx]);
    tx_idx += 4;
	  /* Command_Value */
	half_to_ascii(recv_data.addr, &tx_buf[tx_idx]);
    tx_idx += 4;
	
//	if(0x12 != recv_data.addr)
//		return FALSE;
	
	addr = 0;
    /* 数据内容 */ 
	cell_num = param_get_data(PAR_ID_CB_CELL_NUM);
	if(cell_num >= CELL_MAX_NUM)
		cell_num = CELL_MAX_NUM;
    byte_to_ascii(cell_num , &tx_buf[tx_idx]);
    tx_idx += 2;
    for(i = 0;i < cell_num; ++ i)
    {
        byte_to_ascii(0 , &tx_buf[tx_idx]);
        tx_idx += 2;
    }
	
	temp_num = param_get_data(PAR_ID_CB_TEMP_NUM);	
	if(temp_num >= CFG_TEMP_NUM)
		temp_num = CFG_TEMP_NUM;
	
    byte_to_ascii(temp_num + 2 , &tx_buf[tx_idx]);
    tx_idx += 2;
	byte_to_ascii(master_data_reg.slave_data[addr].env_temp , &tx_buf[tx_idx]); //010结构
    tx_idx += 2;	
		
    for(i = 0;i < temp_num; ++ i)
    {
        byte_to_ascii(master_data_reg.slave_data[addr].cell_temp_buf[i] , &tx_buf[tx_idx]);
        tx_idx += 2;
    }
	byte_to_ascii(master_data_reg.slave_data[addr].mos_temp , &tx_buf[tx_idx]);  //010结构
    tx_idx += 2;	
		
    if(master_data_reg.total_prp_msg.bit.occ)
        byte_to_ascii(0x02 , &tx_buf[tx_idx]);
    else
        byte_to_ascii(0x00 , &tx_buf[tx_idx]);
    tx_idx += 2;
    if(master_data_reg.total_prp_msg.bit.bov)
        byte_to_ascii(0x02 , &tx_buf[tx_idx]);	
	else if (master_data_reg.total_prp_msg.bit.buv)
		byte_to_ascii(0x01 , &tx_buf[tx_idx]);
    else
        byte_to_ascii(0x00 , &tx_buf[tx_idx]);
    tx_idx += 2;  
    if(master_data_reg.total_prp_msg.bit.ocd)
        byte_to_ascii(0x02 , &tx_buf[tx_idx]);
    else
        byte_to_ascii(0x00 , &tx_buf[tx_idx]);
	tx_idx += 2;  
	
    status = 0;/*1*/
    if(master_data_reg.total_prp_msg.bit.occ || master_data_reg.total_prp_msg.bit.occ2)
       status |= 0x04; 
    if(master_data_reg.total_prp_msg.bit.ocd || master_data_reg.total_prp_msg.bit.ocd2)
       status |= 0x10; 
    if(master_data_reg.total_prp_msg.bit.otd)
       status |= 0x20; 
    if(master_data_reg.total_prp_msg.bit.otc)
       status |= 0x40;
    byte_to_ascii(status , &tx_buf[tx_idx]);
    tx_idx += 2; 

    status = 0; /*2*/
    if(master_data_reg.fet_status & 0x01)
        status |= 0x04;
    if(master_data_reg.fet_status & 0x02)
        status |= 0x02;
    byte_to_ascii(status , &tx_buf[tx_idx]);
    tx_idx += 2; 

    status = 0;/*3*/
    if(master_data_reg.total_bus_curr > 0.1)
        status |= 0x80;
    if(master_data_reg.total_bus_curr < -0.1)
        status |= 0x40;
    if(master_data_reg.avg_soc == 100)
        status |= 0x08;
    byte_to_ascii(status , &tx_buf[tx_idx]);
    tx_idx += 2; 
	
    byte_to_ascii(0x00 , &tx_buf[tx_idx]);
    tx_idx += 2;  
    byte_to_ascii(0x00 , &tx_buf[tx_idx]);
    tx_idx += 2;  

    data_len = yd1363_calc_len(tx_idx - 13);
	half_to_ascii(data_len , &tx_buf[9]);
	temp_val = yd1636_calc_crc(&tx_buf[1] , tx_idx - 1);
	half_to_ascii(temp_val , &tx_buf[tx_idx]);
    tx_idx += 4;
	tx_buf[tx_idx ++ ] = EOI;
    
    *tx_len = tx_idx;
    return TRUE;
}

static uint8_t deal_47h_cmd(ydt1363_data_type recv_data, uint8_t* tx_buf, uint16_t* tx_len)
{
    uint16_t tx_idx = 0;
	uint16_t data_len = 0;
    uint16_t temp_val = 0;
	
//	if(0x12 != recv_data.addr)
//		return FALSE;
    tx_buf[tx_idx ++ ] = SOI;
    byte_to_ascii(recv_data.ver , &tx_buf[tx_idx]);
    tx_idx += 2;
    byte_to_ascii(recv_data.addr , &tx_buf[tx_idx]);
    tx_idx += 2;
    byte_to_ascii(recv_data.cid1 , &tx_buf[tx_idx]);
    tx_idx += 2;
    byte_to_ascii(0x00 , &tx_buf[tx_idx]);
    tx_idx += 2;
    /* 长度 */
    half_to_ascii(0x00 , &tx_buf[tx_idx]);
    tx_idx += 4;
	/* INFO */
    half_to_ascii(param_get_data(PAR_ID_COV_PRP_VAL) , &tx_buf[tx_idx]);
    tx_idx += 4;
    half_to_ascii(param_get_data(PAR_ID_CUV_ALM_VAL) , &tx_buf[tx_idx]);
    tx_idx += 4;
    half_to_ascii(param_get_data(PAR_ID_CUV_PRP_VAL) , &tx_buf[tx_idx]);
    tx_idx += 4;
	temp_val = param_get_data(PAR_ID_OTC_PRP_VAL) + 2231;
    half_to_ascii(temp_val,&tx_buf[tx_idx]);
    tx_idx += 4;
	temp_val = param_get_data(PAR_ID_UTC_PRP_VAL) + 2231;
    half_to_ascii(temp_val,&tx_buf[tx_idx]);
    tx_idx += 4;
    half_to_ascii(param_get_data(PAR_ID_OCC_PRP_VAL) * 10, &tx_buf[tx_idx]);
    tx_idx += 4;
    half_to_ascii(param_get_data(PAR_ID_BOV_PRP_VAL) * 10 , &tx_buf[tx_idx]);
    tx_idx += 4;
    half_to_ascii(param_get_data(PAR_ID_BUV_ALM_VAL) * 10 , &tx_buf[tx_idx]);
    tx_idx += 4;
    half_to_ascii(param_get_data(PAR_ID_BUV_PRP_VAL) * 10 , &tx_buf[tx_idx]);
    tx_idx += 4;
    half_to_ascii(param_get_data(PAR_ID_OTD_PRP_VAL) + 2231 , &tx_buf[tx_idx]);
    tx_idx += 4;
    half_to_ascii(param_get_data(PAR_ID_UTD_PRP_VAL) + 2231 , &tx_buf[tx_idx]);
    tx_idx += 4;
    half_to_ascii(-param_get_data(PAR_ID_OCD1_PRP_VAL) * 10 , &tx_buf[tx_idx]);
    tx_idx += 4;

    data_len = yd1363_calc_len(tx_idx - 13);
	half_to_ascii(data_len , &tx_buf[9]);
	temp_val = yd1636_calc_crc(&tx_buf[1] , tx_idx - 1);
	half_to_ascii(temp_val , &tx_buf[tx_idx]);
    tx_idx += 4;
	tx_buf[tx_idx ++ ] = EOI;
    
    *tx_len = tx_idx;
    return TRUE;
}

static uint8_t deal_4Fh_cmd(ydt1363_data_type recv_data, uint8_t* tx_buf, uint16_t* tx_len)
{
	uint16_t tx_idx = 0;
	uint16_t data_len = 0;
    uint16_t temp_val = 0;
  
//	if(0x12 != recv_data.addr)
//		return FALSE;
	
    tx_buf[tx_idx ++ ] = SOI;
    byte_to_ascii(0x20 , &tx_buf[tx_idx]);
    tx_idx += 2;
    byte_to_ascii(recv_data.addr , &tx_buf[tx_idx]);
    tx_idx += 2;
    byte_to_ascii(recv_data.cid1 , &tx_buf[tx_idx]);
    tx_idx += 2;
    byte_to_ascii(0x00 , &tx_buf[tx_idx]);
    tx_idx += 2;
    /* 长度 */
    half_to_ascii(0x00 , &tx_buf[tx_idx]);
    tx_idx += 4;
	/* INFO */
    data_len = yd1363_calc_len(tx_idx - 13);
	half_to_ascii(data_len , &tx_buf[9]);
	temp_val = yd1636_calc_crc(&tx_buf[1] , tx_idx - 1);
	half_to_ascii(temp_val , &tx_buf[tx_idx]);
    tx_idx += 4;
	tx_buf[tx_idx ++ ] = EOI;
    
    *tx_len = tx_idx;
    return TRUE;
}

static uint8_t deal_51h_cmd(ydt1363_data_type recv_data, uint8_t* tx_buf, uint16_t* tx_len)
{
    uint16_t tx_idx = 0;
	uint16_t data_len = 0;
    uint16_t temp_val = 0;
    uint8_t dev_name[20] = DEV_NAME;
    uint8_t pack_name[30] = PAR_DFT_PACK_MFT;
    uint8_t i = 0;
	
//	if(0x12 != recv_data.addr)
//		return FALSE;
		
    tx_buf[tx_idx ++ ] = SOI;
    byte_to_ascii(recv_data.ver , &tx_buf[tx_idx]);
    tx_idx += 2;
    byte_to_ascii(recv_data.addr , &tx_buf[tx_idx]);
    tx_idx += 2;
    byte_to_ascii(recv_data.cid1 , &tx_buf[tx_idx]);
    tx_idx += 2;
    byte_to_ascii(0x00 , &tx_buf[tx_idx]);
    tx_idx += 2;
    /* 长度 */
    half_to_ascii(0x00 , &tx_buf[tx_idx]);
    tx_idx += 4;
	/* INFO */	
		
    for( i = 0;i < 10; ++ i)
	{
		byte_to_ascii(dev_name[i] , &tx_buf[tx_idx]);
		tx_idx += 2;
	}

    half_to_ascii(0 , &tx_buf[tx_idx]);  //DR传0
    tx_idx += 4;

    for( i = 0;i < 20; ++ i)
	{
		byte_to_ascii(pack_name[i] , &tx_buf[tx_idx]);
		tx_idx += 2;
	}		
    
    data_len = yd1363_calc_len(tx_idx - 13);
	half_to_ascii(data_len , &tx_buf[9]);
	temp_val = yd1636_calc_crc(&tx_buf[1] , tx_idx - 1);
	half_to_ascii(temp_val , &tx_buf[tx_idx]);
    tx_idx += 4;
	tx_buf[tx_idx ++ ] = EOI;
    
    *tx_len = tx_idx;
    return TRUE;
}

static uint8_t deal_60h_cmd(ydt1363_data_type recv_data, uint8_t* tx_buf, uint16_t* tx_len)
{
    uint16_t tx_idx = 0;
	uint16_t data_len = 0;
    uint16_t temp_val = 0;
	uint8_t dev_name[10] = DEV_NAME;
    uint8_t i = 0;
    uint16_t pack_ol_state = 0;
    uint8_t j = 0;
	uint16_t data_val = 0;
	
//	if(0x12 != recv_data.addr)
//		return FALSE;

    tx_buf[tx_idx ++ ] = SOI;
    byte_to_ascii(recv_data.ver , &tx_buf[tx_idx]);
    tx_idx += 2;
    byte_to_ascii(recv_data.addr , &tx_buf[tx_idx]);
    tx_idx += 2;
    byte_to_ascii(recv_data.cid1 , &tx_buf[tx_idx]);
    tx_idx += 2;
    byte_to_ascii(0x00 , &tx_buf[tx_idx]);
    tx_idx += 2;
    /* 长度 */
    half_to_ascii(0x00 , &tx_buf[tx_idx]);
    tx_idx += 4;
	/* INFO */
    for( i =0 ;i < 10; ++ i)
    {	
        byte_to_ascii(dev_name[i] , &tx_buf[tx_idx]);
		tx_idx += 2;
    }
	
    for( i =0 ;i < 10; ++ i)
    {
		data_val = param_get_data(PAR_ID_MFT_CODE + i);
        byte_to_ascii(data_val & 0xff, &tx_buf[tx_idx]);
		tx_idx += 2;
		byte_to_ascii(data_val  >> 8 , &tx_buf[tx_idx]);
		tx_idx += 2;
    }
	
    byte_to_ascii(SOFT_VER_MAIN, &tx_buf[tx_idx]);
    tx_idx += 2;
	byte_to_ascii(SOFT_VER_RELEASE, &tx_buf[tx_idx]);
    tx_idx += 2;
	
    byte_to_ascii(master_data_reg.parallel_num, &tx_buf[tx_idx]);
    tx_idx += 2;
    pack_ol_state = var_get_data(VAR_ID_TP_PACK_OL_ST);
    for( i = 0; i < CFG_PARALLEL_NUM; ++ i)
    {
        if((1 << i) & pack_ol_state)
        {
            for( j =0 ;j < 8; ++ j)
            {
				data_val = master_data_reg.slave_data[i].sn_code[j];
				byte_to_ascii(data_val & 0xff , &tx_buf[tx_idx]);
				tx_idx += 2;
				byte_to_ascii(data_val >> 8, &tx_buf[tx_idx]);
				tx_idx += 2;
            }
        }
    }
    
    data_len = yd1363_calc_len(tx_idx - 13);
	half_to_ascii(data_len , &tx_buf[9]);
	temp_val = yd1636_calc_crc(&tx_buf[1] , tx_idx - 1);
	half_to_ascii(temp_val , &tx_buf[tx_idx]);
    tx_idx += 4;
	tx_buf[tx_idx ++ ] = EOI;
    
    *tx_len = tx_idx;
    return TRUE;
}

static uint8_t deal_61h_cmd(ydt1363_data_type recv_data, uint8_t* tx_buf, uint16_t* tx_len)
{
    uint16_t tx_idx = 0;
	uint16_t data_len = 0;
    int16_t temp_val = 0;
	uint16_t soh = 0;
    
//	if(0x12 != recv_data.addr)
//		return FALSE;
		
    tx_buf[tx_idx ++ ] = SOI;
    byte_to_ascii(recv_data.ver , &tx_buf[tx_idx]);
    tx_idx += 2;
    byte_to_ascii(recv_data.addr , &tx_buf[tx_idx]);
    tx_idx += 2;
    byte_to_ascii(recv_data.cid1 , &tx_buf[tx_idx]);
    tx_idx += 2;
    byte_to_ascii(0x00 , &tx_buf[tx_idx]);
    tx_idx += 2;
    /* 长度 */
    half_to_ascii(0x00 , &tx_buf[tx_idx]);
    tx_idx += 4;
	/* INFO */
	half_to_ascii(var_get_data(VAR_ID_TP_AVG_BV) * 10, &tx_buf[tx_idx]);
    tx_idx += 4;
	
	temp_val = master_data_reg.total_bus_curr;
	half_to_ascii(temp_val , &tx_buf[tx_idx]);
    tx_idx += 4;
    byte_to_ascii(var_get_data(VAR_ID_TP_SOC), &tx_buf[tx_idx]);
    tx_idx += 2;
    half_to_ascii(var_get_data(VAR_ID_TP_CYCLE), &tx_buf[tx_idx]);
    tx_idx += 4;
    half_to_ascii(var_get_data(VAR_ID_TP_MAX_CYCLE), &tx_buf[tx_idx]);
    tx_idx += 4;
	soh = var_get_data(VAR_ID_TP_SOH);
	if(soh >= 100)
		soh = 100;
    byte_to_ascii(soh, &tx_buf[tx_idx]);
    tx_idx += 2;
    byte_to_ascii(var_get_data(VAR_ID_TP_MIN_SOH), &tx_buf[tx_idx]);
    tx_idx += 2;
    half_to_ascii(var_get_data(VAR_ID_TP_MAXC_VOLT) ,&tx_buf[tx_idx]);
    tx_idx += 4;
    half_to_ascii(var_get_data(VAR_ID_TP_MAXC_SN) ,&tx_buf[tx_idx]);
    tx_idx += 4;
    half_to_ascii(var_get_data(VAR_ID_TP_MINC_VOLT) ,&tx_buf[tx_idx]);
    tx_idx += 4;
    half_to_ascii(var_get_data(VAR_ID_TP_MINC_SN) ,&tx_buf[tx_idx]);
    tx_idx += 4;
	
	half_to_ascii(var_get_data(VAR_ID_TP_AVG_TEMP) ,&tx_buf[tx_idx]);
    tx_idx += 4;
    half_to_ascii(var_get_data(VAR_ID_TP_MAXT_VAL) ,&tx_buf[tx_idx]);
    tx_idx += 4;
    half_to_ascii(var_get_data(VAR_ID_TP_MAXT_SN) ,&tx_buf[tx_idx]);
    tx_idx += 4;
    half_to_ascii(var_get_data(VAR_ID_TP_MINT_VAL) ,&tx_buf[tx_idx]);
    tx_idx += 4;
    half_to_ascii(var_get_data(VAR_ID_TP_MINT_SN) ,&tx_buf[tx_idx]);
    tx_idx += 4;
	
    half_to_ascii(var_get_data(VAR_ID_TP_AVG_MOST) ,&tx_buf[tx_idx]);
    tx_idx += 4;
    half_to_ascii(var_get_data(VAR_ID_TP_MAX_MOST_VAL) ,&tx_buf[tx_idx]);
    tx_idx += 4;
    half_to_ascii(var_get_data(VAR_ID_TP_MAX_MOST_SN) ,&tx_buf[tx_idx]);
    tx_idx += 4;
    half_to_ascii(var_get_data(VAR_ID_TP_MIN_MOST_VAL) ,&tx_buf[tx_idx]);
    tx_idx += 4;
    half_to_ascii(var_get_data(VAR_ID_TP_MIN_MOST_SN) ,&tx_buf[tx_idx]);
    tx_idx += 4;
    
    half_to_ascii(var_get_data(VAR_ID_TP_AVG_ENVT) ,&tx_buf[tx_idx]);
    tx_idx += 4;
    half_to_ascii(var_get_data(VAR_ID_TP_MAX_ENVT_VAL) ,&tx_buf[tx_idx]);
    tx_idx += 4;
    half_to_ascii(var_get_data(VAR_ID_TP_MAX_ENVT_SN) ,&tx_buf[tx_idx]);
    tx_idx += 4;
    half_to_ascii(var_get_data(VAR_ID_TP_MIN_ENVT_VAL) ,&tx_buf[tx_idx]);
    tx_idx += 4;
    half_to_ascii(var_get_data(VAR_ID_TP_MIN_ENVT_SN) ,&tx_buf[tx_idx]);
    tx_idx += 4;

    data_len = yd1363_calc_len(tx_idx - 13);
	half_to_ascii(data_len , &tx_buf[9]);
	temp_val = yd1636_calc_crc(&tx_buf[1] , tx_idx - 1);
	half_to_ascii(temp_val , &tx_buf[tx_idx]);
    tx_idx += 4;
	tx_buf[tx_idx ++ ] = EOI;
    
    *tx_len = tx_idx;
    return TRUE;
}

static uint16_t get_alarm_msg(void)
{
    return 0;
}

extern master_data_type master_data_reg;
static uint16_t get_prp_msg(void)
{
	uint16_t prp_msg = 0;

	if(master_data_reg.total_prp_msg.bit.ocd || master_data_reg.total_prp_msg.bit.ocd2)
		prp_msg |= (1 << 13);
//	if(master_data_reg.total_prp_msg.bit.occ || master_data_reg.total_prp_msg.bit.occ)
//		prp_msg |= (1 << 14);
	
	if(master_data_reg.total_prp_msg.bit.otc || master_data_reg.total_prp_msg.bit.otd)
		prp_msg |= (1 << 3);
	if(master_data_reg.total_prp_msg.bit.utc || master_data_reg.total_prp_msg.bit.utd)
		prp_msg |= (1 << 2);
	if(master_data_reg.total_prp_msg.bit.otm)
		prp_msg |= (1 << 1);
	
    return prp_msg;
}

static uint8_t deal_62h_cmd(ydt1363_data_type recv_data, uint8_t* tx_buf, uint16_t* tx_len)
{
    uint16_t tx_idx = 0;
	uint16_t data_len = 0;
    uint16_t alarm_msg = 0;
    uint16_t prp_msg = 0;
    uint16_t temp_val = 0;
	
//	if(0x12 != recv_data.addr)
//		return FALSE;
		
    tx_buf[tx_idx ++ ] = SOI;
    byte_to_ascii(recv_data.ver , &tx_buf[tx_idx]);
    tx_idx += 2;
    byte_to_ascii(recv_data.addr , &tx_buf[tx_idx]);
    tx_idx += 2;
    byte_to_ascii(recv_data.cid1 , &tx_buf[tx_idx]);
    tx_idx += 2;
    byte_to_ascii(0x00 , &tx_buf[tx_idx]);
    tx_idx += 2;
    /* 长度 */
    half_to_ascii(0x00 , &tx_buf[tx_idx]);
    tx_idx += 4;
	/* INFO */
    alarm_msg = get_alarm_msg();
	byte_to_ascii(alarm_msg, &tx_buf[tx_idx]);
    tx_idx += 2;
    byte_to_ascii(alarm_msg >> 8, &tx_buf[tx_idx]);
    tx_idx += 2;
    prp_msg = get_prp_msg();
    byte_to_ascii(prp_msg,&tx_buf[tx_idx]);
    tx_idx += 2;
    byte_to_ascii(prp_msg >> 8, &tx_buf[tx_idx]);
    tx_idx += 2;

    data_len = yd1363_calc_len(tx_idx - 13);
	half_to_ascii(data_len , &tx_buf[9]);
	temp_val = yd1636_calc_crc(&tx_buf[1] , tx_idx - 1);
	half_to_ascii(temp_val , &tx_buf[tx_idx]);
    tx_idx += 4;
	tx_buf[tx_idx ++ ] = EOI;
    
    *tx_len = tx_idx;
    return TRUE;
}

static uint8_t deal_63h_cmd(ydt1363_data_type recv_data, uint8_t* tx_buf, uint16_t* tx_len)
{
    uint16_t tx_idx = 0;
    uint8_t temp = 0;
	uint16_t data_len = 0;
    uint16_t temp_val = 0;
	
//	if(0x12 != recv_data.addr)
//		return FALSE;
		
    tx_buf[tx_idx ++ ] = SOI;
    byte_to_ascii(recv_data.ver , &tx_buf[tx_idx]);
    tx_idx += 2;
    byte_to_ascii(recv_data.addr , &tx_buf[tx_idx]);
    tx_idx += 2;
    byte_to_ascii(recv_data.cid1 , &tx_buf[tx_idx]);
    tx_idx += 2;
    byte_to_ascii(0x00 , &tx_buf[tx_idx]);
    tx_idx += 2;
    /* 长度 */
    half_to_ascii(0x00 , &tx_buf[tx_idx]);
    tx_idx += 4;
	/* INFO */
	half_to_ascii(var_get_data(VAR_ID_TP_SOP_CV)*100, &tx_buf[tx_idx]);
    tx_idx += 4;
    half_to_ascii(var_get_data(VAR_ID_TP_SOP_DV)*100, &tx_buf[tx_idx]);
    tx_idx += 4;
    half_to_ascii(var_get_data(VAR_ID_TP_SOP_CC), &tx_buf[tx_idx]);
    tx_idx += 4;
    half_to_ascii(var_get_data(VAR_ID_TP_SOP_DC), &tx_buf[tx_idx]);
    tx_idx += 4;
    
	temp = 0;
    if(parallel_get_pcs_ctrl(PARALLEL_PCS_CHG_EN))
        temp |= 0x80;
    if(parallel_get_pcs_ctrl(PARALLEL_PCS_DSG_EN))
        temp |= 0x40;
	if(parallel_get_pcs_ctrl(PARALLEL_PCS_FROCE_CHG1) || parallel_get_pcs_ctrl(PARALLEL_PCS_FROCE_CHG2))
		temp |= 0x20;
	if(var_get_data(VAR_ID_ASK_FULL_CHG))
		temp |= 0x10;
	
    byte_to_ascii(temp, &tx_buf[tx_idx]);
    tx_idx += 2;
   
    data_len = yd1363_calc_len(tx_idx - 13);
	half_to_ascii(data_len , &tx_buf[9]);
	temp_val = yd1636_calc_crc(&tx_buf[1] , tx_idx - 1);
	half_to_ascii(temp_val , &tx_buf[tx_idx]);
    tx_idx += 4;
	tx_buf[tx_idx ++ ] = EOI;
    
    *tx_len = tx_idx;
    return TRUE;
}

static uint8_t deal_92h_cmd(ydt1363_data_type recv_data, uint8_t* tx_buf, uint16_t* tx_len)
{
    uint16_t tx_idx = 0;
    uint8_t temp = 0;
	uint16_t data_len = 0;
    uint16_t temp_val = 0;
	
//	if(0x12 != recv_data.addr)
//		return FALSE;
		
    tx_buf[tx_idx ++ ] = SOI;
    byte_to_ascii(recv_data.ver , &tx_buf[tx_idx]);
    tx_idx += 2;
    byte_to_ascii(recv_data.addr , &tx_buf[tx_idx]);
    tx_idx += 2;
    byte_to_ascii(recv_data.cid1 , &tx_buf[tx_idx]);
    tx_idx += 2;
    byte_to_ascii(0x00 , &tx_buf[tx_idx]);
    tx_idx += 2;
    /* 长度 */
    half_to_ascii(0x00 , &tx_buf[tx_idx]);
    tx_idx += 4;
    byte_to_ascii(recv_data.addr , &tx_buf[tx_idx]);
    tx_idx += 2;
	/* INFO */
	half_to_ascii(var_get_data(VAR_ID_TP_SOP_CV)*100, &tx_buf[tx_idx]);
    tx_idx += 4;
    half_to_ascii(var_get_data(VAR_ID_TP_SOP_DV)*100, &tx_buf[tx_idx]);
    tx_idx += 4;
    half_to_ascii(var_get_data(VAR_ID_TP_SOP_CC), &tx_buf[tx_idx]);
    tx_idx += 4;
    half_to_ascii(-var_get_data(VAR_ID_TP_SOP_DC), &tx_buf[tx_idx]);
    tx_idx += 4;
    
    if(parallel_get_pcs_ctrl(PARALLEL_PCS_CHG_EN))
        temp |= 0x80;
    if(parallel_get_pcs_ctrl(PARALLEL_PCS_DSG_EN))
        temp |= 0x40;
	if(parallel_get_pcs_ctrl(PARALLEL_PCS_FROCE_CHG1))
		temp |= 0x20;
	if(parallel_get_pcs_ctrl(PARALLEL_PCS_FROCE_CHG2))
		temp |= 0x10;
	if(var_get_data(VAR_ID_ASK_FULL_CHG))
		temp |= 0x08;
	
    byte_to_ascii(temp, &tx_buf[tx_idx]);
    tx_idx += 2;
   
    data_len = yd1363_calc_len(tx_idx - 13);
	half_to_ascii(data_len , &tx_buf[9]);
	temp_val = yd1636_calc_crc(&tx_buf[1] , tx_idx - 1);
	half_to_ascii(temp_val , &tx_buf[tx_idx]);
    tx_idx += 4;
	tx_buf[tx_idx ++ ] = EOI;
    
    *tx_len = tx_idx;
    return TRUE;
}

static uint8_t deal_93h_cmd(ydt1363_data_type recv_data, uint8_t* tx_buf, uint16_t* tx_len)
{
    uint16_t tx_idx = 0;
	uint16_t data_len = 0;
    uint16_t temp_val = 0;
    uint16_t i = 0;	
	
//	if(0x12 != recv_data.addr)
//		return FALSE;
		
    tx_buf[tx_idx ++ ] = SOI;
    byte_to_ascii(recv_data.ver , &tx_buf[tx_idx]);
    tx_idx += 2;
    byte_to_ascii(recv_data.addr , &tx_buf[tx_idx]);
    tx_idx += 2;
    byte_to_ascii(recv_data.cid1 , &tx_buf[tx_idx]);
    tx_idx += 2;
    byte_to_ascii(0x00 , &tx_buf[tx_idx]);
    tx_idx += 2;
    /* 长度 */
    half_to_ascii(0x00 , &tx_buf[tx_idx]);
    tx_idx += 4;
    byte_to_ascii(recv_data.addr , &tx_buf[tx_idx]);
    tx_idx += 2;
	/* INFO */

	for( i = 0;i < 8; ++ i)
	{
		temp_val = param_get_data(PAR_ID_SN_CODE + i);
		byte_to_ascii(temp_val  , &tx_buf[tx_idx]);
		tx_idx += 2;
		byte_to_ascii(temp_val >> 8, &tx_buf[tx_idx]);  //双ASCLL
		tx_idx += 2;
	}

    data_len = yd1363_calc_len(tx_idx - 13);
	half_to_ascii(data_len , &tx_buf[9]);
	temp_val = yd1636_calc_crc(&tx_buf[1] , tx_idx - 1);
	half_to_ascii(temp_val , &tx_buf[tx_idx]);
    tx_idx += 4;
	tx_buf[tx_idx ++ ] = EOI;
    
    *tx_len = tx_idx;
    return TRUE;
}

static uint8_t deal_94h_cmd(ydt1363_data_type recv_data, uint8_t* tx_buf, uint16_t* tx_len)
{
    return TRUE;
}
static uint8_t deal_95h_cmd(ydt1363_data_type recv_data, uint8_t* tx_buf, uint16_t* tx_len)
{
    return TRUE;	
}

static uint8_t deal_96h_cmd(ydt1363_data_type recv_data, uint8_t* tx_buf, uint16_t* tx_len)
{
    uint16_t tx_idx = 0;
	uint16_t data_len = 0;
    uint16_t temp_val = 0;
	
//	if(0x12 != recv_data.addr)
//		return FALSE;
	
    tx_buf[tx_idx ++ ] = SOI;
    byte_to_ascii(recv_data.ver , &tx_buf[tx_idx]);
    tx_idx += 2;
    byte_to_ascii(recv_data.addr , &tx_buf[tx_idx]);
    tx_idx += 2;
    byte_to_ascii(recv_data.cid1 , &tx_buf[tx_idx]);
    tx_idx += 2;
    byte_to_ascii(0x00 , &tx_buf[tx_idx]);
    tx_idx += 2;
    /* 长度 */
    half_to_ascii(0x00 , &tx_buf[tx_idx]);
    tx_idx += 4;
    byte_to_ascii(recv_data.addr , &tx_buf[tx_idx]);
    tx_idx += 2;
	/* INFO */
	byte_to_ascii(SOFT_VER_RELEASE , &tx_buf[tx_idx]);
	tx_idx += 2;
	byte_to_ascii(SOFT_VER_TEST , &tx_buf[tx_idx]);
	tx_idx += 2;
	
	byte_to_ascii(SOFT_VER_MAIN , &tx_buf[tx_idx]);
	tx_idx += 2;
	half_to_ascii(boot_param_read_par(BP_ID_BOOT_VER), &tx_buf[tx_idx]);
    tx_idx += 4;
	
    data_len = yd1363_calc_len(tx_idx - 13);
	half_to_ascii(data_len , &tx_buf[9]);
	temp_val = yd1636_calc_crc(&tx_buf[1] , tx_idx - 1);
	half_to_ascii(temp_val , &tx_buf[tx_idx]);
    tx_idx += 4;
	tx_buf[tx_idx ++ ] = EOI;
    
    *tx_len = tx_idx;
    return TRUE;
}

/********** Copyright (c) 2024 JBD-Energy Storage Technology Co. LTD *********/
